<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- Copyright © 2006-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<title>Implementing FOR construct (GNU libgomp)</title>

<meta name="description" content="Implementing FOR construct (GNU libgomp)">
<meta name="keywords" content="Implementing FOR construct (GNU libgomp)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">

<link href="index.html" rel="start" title="Top">
<link href="Library-Index.html" rel="index" title="Library Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="The-libgomp-ABI.html" rel="up" title="The libgomp ABI">
<link href="Implementing-ORDERED-construct.html" rel="next" title="Implementing ORDERED construct">
<link href="Implementing-PARALLEL-construct.html" rel="prev" title="Implementing PARALLEL construct">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
-->
</style>


</head>

<body lang="en">
<div class="section-level-extent" id="Implementing-FOR-construct">
<div class="nav-panel">
<p>
Next: <a href="Implementing-ORDERED-construct.html" accesskey="n" rel="next">Implementing ORDERED construct</a>, Previous: <a href="Implementing-PARALLEL-construct.html" accesskey="p" rel="prev">Implementing PARALLEL construct</a>, Up: <a href="The-libgomp-ABI.html" accesskey="u" rel="up">The libgomp ABI</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Library-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h3 class="section" id="Implementing-FOR-construct-1"><span>13.11 Implementing FOR construct<a class="copiable-link" href="#Implementing-FOR-construct-1"> &para;</a></span></h3>

<div class="example smallexample">
<pre class="example-preformatted">  #pragma omp parallel for
  for (i = lb; i &lt;= ub; i++)
    body;
</pre></div>

<p>becomes
</p>
<div class="example smallexample">
<pre class="example-preformatted">  void subfunction (void *data)
  {
    long _s0, _e0;
    while (GOMP_loop_static_next (&amp;_s0, &amp;_e0))
    {
      long _e1 = _e0, i;
      for (i = _s0; i &lt; _e1; i++)
        body;
    }
    GOMP_loop_end_nowait ();
  }

  GOMP_parallel_loop_static (subfunction, NULL, 0, lb, ub+1, 1, 0);
  subfunction (NULL);
  GOMP_parallel_end ();
</pre></div>

<div class="example smallexample">
<pre class="example-preformatted">  #pragma omp for schedule(runtime)
  for (i = 0; i &lt; n; i++)
    body;
</pre></div>

<p>becomes
</p>
<div class="example smallexample">
<pre class="example-preformatted">  {
    long i, _s0, _e0;
    if (GOMP_loop_runtime_start (0, n, 1, &amp;_s0, &amp;_e0))
      do {
        long _e1 = _e0;
        for (i = _s0, i &lt; _e0; i++)
          body;
      } while (GOMP_loop_runtime_next (&amp;_s0, _&amp;e0));
    GOMP_loop_end ();
  }
</pre></div>

<p>Note that while it looks like there is trickiness to propagating
a non-constant STEP, there isn&rsquo;t really.  We&rsquo;re explicitly allowed
to evaluate it as many times as we want, and any variables involved
should automatically be handled as PRIVATE or SHARED like any other
variables.  So the expression should remain evaluable in the 
subfunction.  We can also pull it into a local variable if we like,
but since its supposed to remain unchanged, we can also not if we like.
</p>
<p>If we have SCHEDULE(STATIC), and no ORDERED, then we ought to be
able to get away with no work-sharing context at all, since we can
simply perform the arithmetic directly in each thread to divide up
the iterations.  Which would mean that we wouldn&rsquo;t need to call any
of these routines.
</p>
<p>There are separate routines for handling loops with an ORDERED
clause.  Bookkeeping for that is non-trivial...
</p>


</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Implementing-ORDERED-construct.html">Implementing ORDERED construct</a>, Previous: <a href="Implementing-PARALLEL-construct.html">Implementing PARALLEL construct</a>, Up: <a href="The-libgomp-ABI.html">The libgomp ABI</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Library-Index.html" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>
